#!/bin/bash

# Minecraft Java版服务器更新模块
# 描述：负责检测和更新Java版Minecraft服务器

# 获取当前Java版服务器版本
get_current_java_version() {
    local server_dir="$JAVA_SERVER_DIR"
    local version_file="$server_dir/version.txt"
    local current_version="未知"
    
    # 首先尝试从version.txt文件获取版本
    if [ -f "$version_file" ]; then
        current_version=$(cat "$version_file")
    elif [ -f "$server_dir/server.properties" ]; then
        # 尝试从服务器日志解析版本信息
        local log_file="$server_dir/logs/latest.log"
        if [ -f "$log_file" ]; then
            local version_line=$(grep -m 1 "Starting minecraft server version" "$log_file")
            if [ -n "$version_line" ]; then
                current_version=$(echo "$version_line" | sed -E 's/.*version ([0-9]+\.[0-9]+(\.[0-9]+)?).*/\1/')
            fi
        fi
    fi
    
    echo "$current_version"
}

# 获取最新Java版服务器版本
get_latest_java_version() {
    local server_type="$JAVA_SERVER_TYPE"
    local latest_version="未知"
    local temp_file="$TEMP_DIR/java_version_check.tmp"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 正在检查最新的Java版服务器版本"
    echo -e "服务器类型: $server_type"
    echo -e "=====================================================\e[0m"
    
    case "$server_type" in
        "vanilla")
            # 从Mojang API获取最新版本
            echo -e "\e[1;36m正在从Mojang API获取最新版本信息...\e[0m"
            log_info "正在从Mojang API获取最新版本信息..."
            if download_file "$JAVA_API_URL" "$temp_file"; then
                latest_version=$(grep -o '"release": "[^"]*' "$temp_file" | grep -o '[^"]*$')
                echo -e "\e[1;32m成功获取版本信息: $latest_version\e[0m"
            else
                echo -e "\e[1;31m无法从API获取版本信息\e[0m"
            fi
            ;;
        "paper")
            # 从PaperMC API获取最新版本
            echo -e "\e[1;36m正在从PaperMC API获取最新版本信息...\e[0m"
            log_info "正在从PaperMC API获取最新版本信息..."
            if download_file "$JAVA_API_URL" "$temp_file"; then
                # 获取最新Minecraft版本
                local mc_version=$(grep -o '"versions": \[[^]]*\]' "$temp_file" | grep -o '"[^"]*"' | tail -1 | sed 's/"//g')
                echo -e "\e[1;36m获取到最新MC版本: $mc_version\e[0m"
                
                if [ -n "$mc_version" ]; then
                    # 获取该Minecraft版本的最新构建版本
                    echo -e "\e[1;36m正在获取 $mc_version 的最新构建版本...\e[0m"
                    if download_file "${JAVA_API_URL}/${mc_version}" "$temp_file"; then
                        local build=$(grep -o '"builds": \[[^]]*\]' "$temp_file" | grep -o '[0-9]*' | tail -1)
                        if [ -n "$build" ]; then
                            latest_version="$mc_version-$build"
                            echo -e "\e[1;32m成功获取最新构建版本: $latest_version\e[0m"
                        fi
                    fi
                fi
            fi
            ;;
        "spigot")
            # 从SpigotMC获取最新版本
            echo -e "\e[1;36m正在从SpigotMC获取最新版本信息...\e[0m"
            log_info "正在从SpigotMC获取最新版本信息..."
            if download_file "$JAVA_API_URL" "$temp_file"; then
                local build_number=$(grep -o '"number":[0-9]*' "$temp_file" | grep -o '[0-9]*')
                if [ -n "$build_number" ]; then
                    latest_version="build-$build_number"
                    echo -e "\e[1;32m成功获取最新构建版本: $latest_version\e[0m"
                fi
            fi
            ;;
        "fabric")
            # 从Fabric API获取最新版本
            echo -e "\e[1;36m正在从Fabric API获取最新版本信息...\e[0m"
            log_info "正在从Fabric API获取最新版本信息..."
            # 先获取最新的Minecraft版本
            if download_file "$JAVA_API_URL" "$temp_file"; then
                local mc_version=$(grep -m 1 -o '"version":"[^"]*"' "$temp_file" | grep -o '[^"]*$' | sed 's/"//g')
                echo -e "\e[1;36m获取到最新MC版本: $mc_version\e[0m"
                
                if [ -n "$mc_version" ]; then
                    # 然后获取该Minecraft版本的最新Fabric加载器版本
                    echo -e "\e[1;36m正在获取 $mc_version 的最新Fabric加载器版本...\e[0m"
                    if download_file "${JAVA_API_URL}/${mc_version}" "$temp_file"; then
                        local loader_version=$(grep -m 1 -o '"loader":{"version":"[^"]*"' "$temp_file" | grep -o '[^"]*$' | sed 's/"//g')
                        if [ -n "$loader_version" ]; then
                            latest_version="$mc_version-$loader_version"
                            echo -e "\e[1;32m成功获取最新加载器版本: $latest_version\e[0m"
                        fi
                    fi
                fi
            fi
            ;;
        *)
            echo -e "\e[1;31m未知的Java服务器类型: $server_type\e[0m"
            log_error "未知的Java服务器类型: $server_type"
            ;;
    esac
    
    if [ "$latest_version" = "未知" ]; then
        log_warning "无法获取最新版本信息"
        echo -e "\e[1;31m无法获取最新版本信息\e[0m"
    else
        log_info "====================================================="
        log_info "检测到最新Java版服务器版本($server_type): $latest_version"
        log_info "====================================================="
    fi
    
    echo "$latest_version"
}

# 下载并更新Java版服务器
download_and_update_java_server() {
    local server_type="$JAVA_SERVER_TYPE"
    local server_dir="$JAVA_SERVER_DIR"
    local target_version="$1"  # 可能是特定版本，也可能是"latest"
    local download_url=""
    local download_file_name=""
    local temp_dir="$TEMP_DIR/java_update"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 准备下载和更新Java版服务器"
    echo -e "服务器类型: $server_type"
    echo -e "目标版本: $target_version"
    echo -e "=====================================================\e[0m"
    
    # 创建临时目录
    mkdir -p "$temp_dir"
    
    # 根据服务器类型构建下载URL
    echo -e "\e[1;36m正在构建下载URL...\e[0m"
    case "$server_type" in
        "vanilla")
            echo -e "\e[1;36m处理原版(Vanilla)服务器...\e[0m"
            if [ "$target_version" = "latest" ]; then
                # 获取最新版本
                echo -e "\e[1;36m获取最新版本信息...\e[0m"
                local version_manifest="$temp_dir/version_manifest.json"
                download_file "$JAVA_API_URL" "$version_manifest"
                
                target_version=$(grep -o '"release": "[^"]*' "$version_manifest" | grep -o '[^"]*$')
                echo -e "\e[1;36m找到最新版本: $target_version\e[0m"
                local version_url=$(grep -A 5 "\"id\": \"$target_version\"" "$version_manifest" | grep -o '"url": "[^"]*' | grep -o 'https://[^"]*')
                
                if [ -n "$version_url" ]; then
                    echo -e "\e[1;36m获取版本详情...\e[0m"
                    local version_json="$temp_dir/version.json"
                    download_file "$version_url" "$version_json"
                    
                    download_url=$(grep -o '"server": "[^"]*' "$version_json" | grep -o 'https://[^"]*')
                    download_file_name="server.jar"
                    echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                fi
            else
                # 获取特定版本
                echo -e "\e[1;36m获取指定版本: $target_version\e[0m"
                local version_manifest="$temp_dir/version_manifest.json"
                download_file "$JAVA_API_URL" "$version_manifest"
                
                local version_url=$(grep -A 5 "\"id\": \"$target_version\"" "$version_manifest" | grep -o '"url": "[^"]*' | grep -o 'https://[^"]*')
                
                if [ -n "$version_url" ]; then
                    echo -e "\e[1;36m获取版本详情...\e[0m"
                    local version_json="$temp_dir/version.json"
                    download_file "$version_url" "$version_json"
                    
                    download_url=$(grep -o '"server": "[^"]*' "$version_json" | grep -o 'https://[^"]*')
                    download_file_name="server.jar"
                    echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                fi
            fi
            ;;
        "paper")
            echo -e "\e[1;36m处理Paper服务器...\e[0m"
            if [ "$target_version" = "latest" ]; then
                # 获取最新版本信息
                echo -e "\e[1;36m获取最新Paper版本信息...\e[0m"
                local version_info="$temp_dir/paper_versions.json"
                download_file "$JAVA_API_URL" "$version_info"
                
                local mc_version=$(grep -o '"versions": \[[^]]*\]' "$version_info" | grep -o '"[^"]*"' | tail -1 | sed 's/"//g')
                echo -e "\e[1;36m找到最新MC版本: $mc_version\e[0m"
                
                if [ -n "$mc_version" ]; then
                    echo -e "\e[1;36m获取构建信息...\e[0m"
                    local build_info="$temp_dir/paper_builds.json"
                    download_file "${JAVA_API_URL}/${mc_version}" "$build_info"
                    
                    local build=$(grep -o '"builds": \[[^]]*\]' "$build_info" | grep -o '[0-9]*' | tail -1)
                    echo -e "\e[1;36m找到最新构建版本: $build\e[0m"
                    
                    if [ -n "$build" ]; then
                        download_url="${JAVA_DOWNLOAD_URL}${mc_version}/builds/${build}/downloads/paper-${mc_version}-${build}.jar"
                        download_file_name="paper-$mc_version-$build.jar"
                        target_version="$mc_version-$build"
                        echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                    fi
                fi
            else
                # 解析版本字符串 (例如: 1.19.2-386)
                echo -e "\e[1;36m解析版本字符串: $target_version\e[0m"
                IFS='-' read -ra VERSION_PARTS <<< "$target_version"
                local mc_version="${VERSION_PARTS[0]}"
                local build="${VERSION_PARTS[1]}"
                
                if [ -n "$mc_version" ] && [ -n "$build" ]; then
                    download_url="${JAVA_DOWNLOAD_URL}${mc_version}/builds/${build}/downloads/paper-${mc_version}-${build}.jar"
                    download_file_name="paper-$mc_version-$build.jar"
                    echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                else
                    echo -e "\e[1;31m无效的PaperMC版本格式: $target_version\e[0m"
                    log_error "无效的PaperMC版本格式: $target_version"
                    return 1
                fi
            fi
            ;;
        "spigot")
            echo -e "\e[1;31mSpigot服务器更新需要使用BuildTools，建议手动更新\e[0m"
            log_warning "Spigot服务器更新需要使用BuildTools，建议手动更新"
            log_info "请访问 https://www.spigotmc.org/wiki/buildtools/ 获取更多信息"
            return 1
            ;;
        "fabric")
            echo -e "\e[1;36m处理Fabric服务器...\e[0m"
            if [ "$target_version" = "latest" ]; then
                # 获取最新版本信息
                echo -e "\e[1;36m获取最新Fabric版本信息...\e[0m"
                local game_versions="$temp_dir/fabric_game_versions.json"
                download_file "$JAVA_API_URL" "$game_versions"
                
                local mc_version=$(grep -m 1 -o '"version":"[^"]*"' "$game_versions" | grep -o '[^"]*$' | sed 's/"//g')
                echo -e "\e[1;36m找到最新MC版本: $mc_version\e[0m"
                
                if [ -n "$mc_version" ]; then
                    echo -e "\e[1;36m获取加载器版本信息...\e[0m"
                    local loader_versions="$temp_dir/fabric_loader_versions.json"
                    download_file "${JAVA_API_URL}/${mc_version}" "$loader_versions"
                    
                    local loader_version=$(grep -m 1 -o '"loader":{"version":"[^"]*"' "$loader_versions" | grep -o '[^"]*$' | sed 's/"//g')
                    echo -e "\e[1;36m找到最新加载器版本: $loader_version\e[0m"
                    
                    if [ -n "$loader_version" ]; then
                        download_url="${JAVA_DOWNLOAD_URL}${mc_version}/${loader_version}/server/jar"
                        download_file_name="fabric-server-$mc_version-$loader_version.jar"
                        target_version="$mc_version-$loader_version"
                        echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                    fi
                fi
            else
                # 解析版本字符串 (例如: 1.19.2-0.14.21)
                echo -e "\e[1;36m解析版本字符串: $target_version\e[0m"
                IFS='-' read -ra VERSION_PARTS <<< "$target_version"
                local mc_version="${VERSION_PARTS[0]}"
                local loader_version="${VERSION_PARTS[1]}"
                
                if [ -n "$mc_version" ] && [ -n "$loader_version" ]; then
                    download_url="${JAVA_DOWNLOAD_URL}${mc_version}/${loader_version}/server/jar"
                    download_file_name="fabric-server-$mc_version-$loader_version.jar"
                    echo -e "\e[1;32m成功构建下载URL: $download_url\e[0m"
                else
                    echo -e "\e[1;31m无效的Fabric版本格式: $target_version\e[0m"
                    log_error "无效的Fabric版本格式: $target_version"
                    return 1
                fi
            fi
            ;;
        *)
            echo -e "\e[1;31m未知的Java服务器类型: $server_type\e[0m"
            log_error "未知的Java服务器类型: $server_type"
            return 1
            ;;
    esac
    
    if [ -z "$download_url" ] || [ -z "$download_file_name" ]; then
        echo -e "\e[1;31m无法构建下载URL，更新失败\e[0m"
        log_error "无法构建下载URL，更新失败"
        return 1
    fi
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 下载服务器JAR文件"
    echo -e "操作: 正在下载 $server_type 服务器"
    echo -e "URL: $download_url"
    echo -e "=====================================================\e[0m"
    
    local temp_jar="$temp_dir/server.jar"
    if ! download_file "$download_url" "$temp_jar"; then
        echo -e "\e[1;31m下载服务器JAR文件失败\e[0m"
        log_error "下载服务器JAR文件失败"
        
        # 尝试直接使用curl下载
        echo -e "\e[1;33m尝试最后一次下载...\e[0m"
        if curl -A "$USER_AGENT" -L --fail -o "$temp_jar" "$download_url"; then
            echo -e "\e[1;32m下载成功\e[0m"
        else
            echo -e "\e[1;31m下载失败\e[0m"
            echo -e "\e[1;31m请检查网络连接或版本号是否正确\e[0m"
            return 1
        fi
    fi
    
    # 创建版本文件
    echo "$target_version" > "$temp_dir/version.txt"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 停止服务器"
    echo -e "会话名称: $JAVA_SESSION_NAME"
    echo -e "=====================================================\e[0m"
    
    # 停止服务器
    stop_server "$JAVA_SESSION_NAME" "stop"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 备份当前服务器"
    echo -e "服务器目录: $server_dir"
    echo -e "=====================================================\e[0m"
    
    # 备份当前服务器
    create_backup "$server_dir" "java"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 更新服务器文件"
    echo -e "源文件: $temp_jar"
    echo -e "目标文件: $server_dir/server.jar"
    echo -e "=====================================================\e[0m"
    
    # 更新服务器文件
    log_info "正在更新服务器文件..."
    cp "$temp_jar" "$server_dir/server.jar"
    cp "$temp_dir/version.txt" "$server_dir/version.txt"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 清理临时文件"
    echo -e "临时目录: $temp_dir"
    echo -e "=====================================================\e[0m"
    
    # 清理临时文件
    rm -rf "$temp_dir"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 完成更新"
    echo -e "服务器类型: $server_type"
    echo -e "版本: $target_version"
    echo -e "自动重启: ${JAVA_AUTO_RESTART}"
    echo -e "=====================================================\e[0m"
    
    # 启动服务器（如果配置了自动重启）
    if [ "$JAVA_AUTO_RESTART" = "true" ]; then
        echo -e "\e[1;32m正在重启服务器...\e[0m"
        start_server "$server_dir" "$JAVA_SESSION_NAME" "$JAVA_START_COMMAND"
    else
        echo -e "\e[1;36m服务器已更新，但未自动重启（自动重启已禁用）\e[0m"
        log_info "服务器已更新，但未自动重启（自动重启已禁用）"
    fi
    
    return 0
}

# 主更新函数
update_java_server() {
    local server_dir="$JAVA_SERVER_DIR"
    
    echo -e "\e[1;33m====================================================="
    echo -e "步骤: 开始Java版服务器更新流程"
    echo -e "服务器类型: $JAVA_SERVER_TYPE"
    echo -e "服务器目录: $server_dir"
    echo -e "=====================================================\e[0m"
    
    # 验证服务器目录存在
    if [ ! -d "$server_dir" ]; then
        echo -e "\e[1;31m服务器目录不存在: $server_dir\e[0m"
        log_error "Java版服务器目录不存在: $server_dir"
        return 1
    fi
    
    # 获取当前版本
    echo -e "\e[1;36m获取当前服务器版本...\e[0m"
    local current_version=$(get_current_java_version)
    log_info "====================================================="
    log_info "当前Java版服务器版本($JAVA_SERVER_TYPE): $current_version"
    log_info "====================================================="
    
    # 如果配置了特定版本，则使用特定版本
    if [ -n "$JAVA_VERSION" ]; then
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 使用配置中指定的版本"
        echo -e "目标版本: $JAVA_VERSION"
        echo -e "=====================================================\e[0m"
        
        log_info "使用配置中指定的版本: $JAVA_VERSION"
        download_and_update_java_server "$JAVA_VERSION"
        
        # 发送通知
        send_notification "Java" "$current_version" "$JAVA_VERSION"
        
        return $?
    else
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 检查最新版本"
        echo -e "服务器类型: $JAVA_SERVER_TYPE"
        echo -e "=====================================================\e[0m"
        
        # 获取最新版本
        local latest_version=$(get_latest_java_version)
        
        # 如果无法获取最新版本，退出
        if [ "$latest_version" = "未知" ]; then
            echo -e "\e[1;31m无法获取最新版本信息，更新失败\e[0m"
            log_error "无法获取最新版本信息，更新失败"
            return 1
        fi
        
        echo -e "\e[1;33m====================================================="
        echo -e "步骤: 版本比较"
        echo -e "当前版本: $current_version"
        echo -e "最新版本: $latest_version"
        echo -e "=====================================================\e[0m"
        
        # 比较版本
        if [ "$current_version" != "$latest_version" ] && [ "$current_version" != "未知" ]; then
            echo -e "\e[1;32m发现新版本，准备更新...\e[0m"
            log_info "====================================================="
            log_info "版本比较: 当前版本[$current_version] ≠ 最新版本[$latest_version]"
            log_info "发现新版本，正在准备更新..."
            log_info "====================================================="
            
            echo -e "\e[1;33m====================================================="
            echo -e "步骤: 更新到最新版本"
            echo -e "目标版本: $latest_version"
            echo -e "=====================================================\e[0m"
            
            download_and_update_java_server "latest"
            
            # 发送通知
            send_notification "Java" "$current_version" "$latest_version"
            
            return $?
        else
            echo -e "\e[1;32m服务器已是最新版本，无需更新\e[0m"
            log_info "====================================================="
            log_info "版本比较: 当前版本[$current_version] = 最新版本[$latest_version]"
            log_info "服务器已经是最新版本，无需更新"
            log_info "====================================================="
            
            echo -e "\e[1;33m====================================================="
            echo -e "结果: 服务器已是最新版本"
            echo -e "版本: $current_version"
            echo -e "无需更新"
            echo -e "=====================================================\e[0m"
            
            return 0
        fi
    fi
} 